package com.itheima.prize.api.action;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.itheima.prize.commons.config.RedisKeys;
import com.itheima.prize.commons.db.entity.CardUser;
import com.itheima.prize.commons.db.service.CardUserService;
import com.itheima.prize.commons.utils.ApiResult;
import com.itheima.prize.commons.utils.PasswordUtil;
import com.itheima.prize.commons.utils.RedisUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;

@RestController
@RequestMapping(value = "/api")
@Api(tags = {"登录模块"})
public class LoginController {
    @Autowired
    private CardUserService userService;

    @Autowired
    private RedisUtil redisUtil;

    @PostMapping("/login")
    @ApiOperation(value = "登录")
    @ApiImplicitParams({
            @ApiImplicitParam(name="account",value = "用户名",required = true),//required = true表示这个参数是必填的，前端必须传过来。
            @ApiImplicitParam(name="password",value = "密码",required = true)
    })
    public ApiResult login(HttpServletRequest request, @RequestParam String account,@RequestParam String password) {
        //TODO：任务3.1-登录模块-用户登录 (完成)
        Integer errortimes = (Integer) redisUtil.get(RedisKeys.USERLOGINTIMES+account);//比如 "userLoginTimes_张三"，用来区分不同用户的错误次数
        if (errortimes != null && errortimes >= 5){
            return new ApiResult(0, "密码错误5次，请5分钟后再登录",null);
        }
        QueryWrapper<CardUser> wrapper = new QueryWrapper<>();
        wrapper.eq("uname",account).eq("passwd",PasswordUtil.encodePassword(password));
        List<CardUser> users = userService.list(wrapper);//list(wrapper) 方法就是根据上面的条件去数据库查询用户，查询结果会存到一个List<CardUser>类型的变量users里
        if (users != null && users.size() > 0) {//如果前面查询到的用户列表users不是空的，并且里面至少有 1 条数据
            CardUser user = users.get(0);//从查询结果中取出第一个用户对象
            user.setPasswd(null);//把用户对象里的密码（passwd）和身份证号（idcard）清空
            user.setIdcard(null);//目的：保护敏感信息，避免这些隐私数据返回给前端
            HttpSession session = request.getSession();//创建 / 获取当前用户的会话（session），相当于给用户发一个 "已登录通行证"
            session.setAttribute("user",user);//把用户信息存到会话里，这样用户后续访问其他页面时，系统能识别出 "这是已登录的用户"
            return new ApiResult(1, "登录成功",user);
        } else {
            //错误计数，5次锁定5分钟
            redisUtil.incr(RedisKeys.USERLOGINTIMES+account,1);//用 Redis 记录这个账号的错误次数，每次失败就把次数加 1（比如从 2 次变成 3 次）
            redisUtil.expire(RedisKeys.USERLOGINTIMES+account,60 * 5);//设置这个错误次数的过期时间为 5 分钟（60 秒 ×5）//5 分钟后，这个错误次数会自动过期，过期后这个账号的错误次数会自动归零
            return new ApiResult(0, "账户名或密码错误",null);
        }
    }

    @GetMapping("/logout")
    @ApiOperation(value = "退出")
    public ApiResult logout(HttpServletRequest request) {
        //TODO：任务3.2-登录模块-用户退出 (完成)
        HttpSession session = request.getSession();//获取session
        if (session != null){//session不为空
            session.invalidate();//销毁session
        }
        return new ApiResult(1, "退出成功",null);//返回结果
    }

}